<!DOCTYPE html>
<html>
<head><meta name="generator" content="Hexo 3.9.0">
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    
    <title>
        Java 面试题系列篇-Mybatis 框架 |
        
        Darklovy</title>
    <meta name="description" content>
    <meta name="keywords" content>
    <meta name="HandheldFriendly" content="True">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <link rel="shortcut icon" href="/">
    <link rel="alternate" href="/atom.xml" title="Darklovy">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <meta name="description" content="Mybatis 框架【MyBatis】MyBatis中使用#和$书写占位符有什么区别？答：#将传入的数据都当成一个字符串，会对传入的数据自动加上引号；将传入的数据直接显示生成在SQL中。注意：使用​占位符可能会导致SQL注射攻击，能用#的地方就不要使用，写order by子句的时候应该用​而不是#。 {}是预编译处理，${}是字符串替换。 Mybatis在处理#{}时，会将sql中的#{}替换为?">
<meta name="keywords" content="Java">
<meta property="og:type" content="article">
<meta property="og:title" content="Java 面试题系列篇-Mybatis 框架">
<meta property="og:url" content="https://www.ttxxly.top/2018/10/20/Java-面试题系列篇-Mybatis-框架/index.html">
<meta property="og:site_name" content="Darklovy">
<meta property="og:description" content="Mybatis 框架【MyBatis】MyBatis中使用#和$书写占位符有什么区别？答：#将传入的数据都当成一个字符串，会对传入的数据自动加上引号；将传入的数据直接显示生成在SQL中。注意：使用​占位符可能会导致SQL注射攻击，能用#的地方就不要使用，写order by子句的时候应该用​而不是#。 {}是预编译处理，${}是字符串替换。 Mybatis在处理#{}时，会将sql中的#{}替换为?">
<meta property="og:locale" content="en">
<meta property="og:updated_time" content="2018-12-25T07:27:58.297Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Java 面试题系列篇-Mybatis 框架">
<meta name="twitter:description" content="Mybatis 框架【MyBatis】MyBatis中使用#和$书写占位符有什么区别？答：#将传入的数据都当成一个字符串，会对传入的数据自动加上引号；将传入的数据直接显示生成在SQL中。注意：使用​占位符可能会导致SQL注射攻击，能用#的地方就不要使用，写order by子句的时候应该用​而不是#。 {}是预编译处理，${}是字符串替换。 Mybatis在处理#{}时，会将sql中的#{}替换为?">

    <link href="https://fonts.googleapis.com/css?family=Inconsolata|Titillium+Web" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css?family=Roboto+Mono" rel="stylesheet">
    <link href="//cdn.bootcss.com/node-waves/0.7.5/waves.min.css" rel="stylesheet">
    <link rel="stylesheet" href="/style.css">
    <script>
        function setLoadingBarProgress(num) {
            document.getElementById('loading-bar').style.width = num + "%";
        }
    </script>
</head>
</html>
<body>
  <div id="loading-bar-wrapper">
  <div id="loading-bar"></div>
</div>


  <script>setLoadingBarProgress(20)</script> 
  <header class="l_header">
	<div class='wrapper'>
		<div class="nav-main container container--flex">
			<a class="logo flat-box" href='/' >
				Darklovy
			</a>
			<div class='menu'>
				<ul class='h-list'>
					
						<li>
							<a class='flat-box nav-Home' href='/'>
								首页
							</a>
						</li>
					
						<li>
							<a class='flat-box nav-archives' href='/archives'>
								归档
							</a>
						</li>
					
						<li>
							<a class='flat-box nav-categories' href='/categories'>
								分类
							</a>
						</li>
					
						<li>
							<a class='flat-box nav-tags' href='/tags'>
								标签
							</a>
						</li>
					
						<li>
							<a class='flat-box nav-algorithm' href='https://book.algorithm.ttxxly.top/'>
								算法
							</a>
						</li>
					
						<li>
							<a class='flat-box nav-python' href='https://book.python.ttxxly.top/'>
								python
							</a>
						</li>
					
						<li>
							<a class='flat-box nav-about' href='/about'>
								关于
							</a>
						</li>
					
				</ul>
				<div class='underline'></div>
			</div>
			
				<div class="m_search">
					<form name="searchform" class="form u-search-form">
						<input type="text" class="input u-search-input" placeholder="Search" />
						<span class="icon icon-search"></span>
					</form>
				</div>
			
			<ul class='switcher h-list'>
				
					<li class='s-search'><a href='javascript:void(0)'><span class="icon icon-search flat-box"></span></a></li>
				
				<li class='s-menu'><a href='javascript:void(0)'><span class="icon icon-menu flat-box"></span></a></li>
			</ul>
		</div>
		
		<div class='nav-sub container container--flex'>
			<a class="logo" class="flat-box" href='javascript:void(0)'>
				Word of Forks
			</a>

			<ul class='switcher h-list'>
				<li class='s-comment'><a href='javascript:void(0)'><span class="icon icon-chat_bubble_outline flat-box"></span></a></li>
				<li class='s-top'><a href='javascript:void(0)'><span class="icon icon-arrow_upward flat-box"></span></a></li>
				<li class='s-toc'><a href='javascript:void(0)'><span class="icon icon-format_list_numbered flat-box"></span></a></li>
			</ul>
		</div>
	</div>
</header>
<aside class="menu-phone">
	<nav>
		
			<a href="/" class="nav-Home nav">
				首页
			</a>
		
			<a href="/archives" class="nav-archives nav">
				归档
			</a>
		
			<a href="/categories" class="nav-categories nav">
				分类
			</a>
		
			<a href="/tags" class="nav-tags nav">
				标签
			</a>
		
			<a href="https://book.algorithm.ttxxly.top/" class="nav-algorithm nav">
				算法
			</a>
		
			<a href="https://book.python.ttxxly.top/" class="nav-python nav">
				python
			</a>
		
			<a href="/about" class="nav-about nav">
				关于
			</a>
		
	</nav>
</aside>

    <script>setLoadingBarProgress(40);</script>
  <div class="l_body">
    <div class='container clearfix'>
      <div class='l_main'>
        <article id="post-Java-面试题系列篇-Mybatis-框架"
  class="post white-box article-type-post"
  itemscope itemprop="blogPost">
	<section class='meta'>
	<h2 class="title">
  	<a href="/2018/10/20/Java-面试题系列篇-Mybatis-框架/">
    	Java 面试题系列篇-Mybatis 框架
    </a>
  </h2>
	<time>
	  Oct 20, 2018
	</time>
	
	</section>
	
		<section class="toc-wrapper"><ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#Mybatis-框架"><span class="toc-number">1.</span> <span class="toc-text">Mybatis 框架</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#【MyBatis】MyBatis中使用-和-书写占位符有什么区别？"><span class="toc-number">1.1.</span> <span class="toc-text">【MyBatis】MyBatis中使用#和$书写占位符有什么区别？</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#【MyBatis】解释一下MyBatis中命名空间（namespace）的作用。"><span class="toc-number">1.2.</span> <span class="toc-text">【MyBatis】解释一下MyBatis中命名空间（namespace）的作用。</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#【MyBatis】动态SQL是什么意思？"><span class="toc-number">1.3.</span> <span class="toc-text">【MyBatis】动态SQL是什么意思？</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Mybatis当实体类中的属性名和表中的字段名不一样-，怎么办-？"><span class="toc-number">1.4.</span> <span class="toc-text">Mybatis当实体类中的属性名和表中的字段名不一样 ，怎么办 ？</span></a></li></ol></li></ol></section>
	
	<section class="article typo">
  	<div class="article-entry" itemprop="articleBody">
    	<h2 id="Mybatis-框架"><a href="#Mybatis-框架" class="headerlink" title="Mybatis 框架"></a>Mybatis 框架</h2><h3 id="【MyBatis】MyBatis中使用-和-书写占位符有什么区别？"><a href="#【MyBatis】MyBatis中使用-和-书写占位符有什么区别？" class="headerlink" title="【MyBatis】MyBatis中使用#和$书写占位符有什么区别？"></a>【MyBatis】MyBatis中使用#和$书写占位符有什么区别？</h3><p>答：#将传入的数据都当成一个字符串，会对传入的数据自动加上引号；将传入的数据直接显示生成在SQL中。注意：使用​占位符可能会导致SQL注射攻击，能用#的地方就不要使用，写order by子句的时候应该用​而不是#。</p>
<p>{}是预编译处理，${}是字符串替换。</p>
<p>Mybatis在处理#{}时，会将sql中的#{}替换为?号，调用PreparedStatement的set方法来赋值；</p>
<p>Mybatis在处理{}时，就是把​{}替换成变量的值。</p>
<p>使用#{}可以有效的防止SQL注入，提高系统安全性。</p>
<h3 id="【MyBatis】解释一下MyBatis中命名空间（namespace）的作用。"><a href="#【MyBatis】解释一下MyBatis中命名空间（namespace）的作用。" class="headerlink" title="【MyBatis】解释一下MyBatis中命名空间（namespace）的作用。"></a>【MyBatis】解释一下MyBatis中命名空间（namespace）的作用。</h3><p>答：在大型项目中，可能存在大量的SQL语句，这时候为每个SQL语句起一个唯一的标识（ID）就变得并不容易了。为了解决这个问题，在MyBatis中，可以为每个映射文件起一个唯一的命名空间，这样定义在这个映射文件中的每个SQL语句就成了定义在这个命名空间中的一个ID。只要我们能够保证每个命名空间中这个ID是唯一的，即使在不同映射文件中的语句ID相同，也不会再产生冲突了。</p>
<h3 id="【MyBatis】动态SQL是什么意思？"><a href="#【MyBatis】动态SQL是什么意思？" class="headerlink" title="【MyBatis】动态SQL是什么意思？"></a>【MyBatis】动态SQL是什么意思？</h3><p>答：对于一些复杂的查询，我们可能会指定多个查询条件，但是这些条件可能存在也可能不存在，例如在58同城上面找房子，我们可能会指定面积、楼层和所在位置来查找房源，也可能会指定面积、价格、户型和所在位置来查找房源，此时就需要根据用户指定的条件动态生成SQL语句。如果不使用持久层框架我们可能需要自己拼装SQL语句，还好MyBatis提供了动态SQL的功能来解决这个问题。MyBatis中用于实现动态SQL的元素主要有： </p>
<ul>
<li>if </li>
<li>choose / when / otherwise </li>
<li>trim </li>
<li>where </li>
<li>set </li>
<li>foreach</li>
</ul>
<p>下面是映射文件的片段。</p>
<p>​    <select id="foo" parametertype="Blog" resulttype="Blog"></select></p>
<p>​        select * from t_blog where 1 = 1</p>
<p>​        <if test="title != null"></if></p>
<p>​            and title = #{title}</p>
<p>​        </p>
<p>​        <if test="content != null"></if></p>
<p>​            and content = #{content}</p>
<p>​        </p>
<p>​        <if test="owner != null"></if></p>
<p>​            and owner = #{owner}</p>
<p>​        </p>
<p>   </p>
<p>当然也可以像下面这些书写。</p>
<p>​    <select id="foo" parametertype="Blog" resulttype="Blog"></select></p>
<p>​        select * from t_blog where 1 = 1 </p>
<p>​        <choose></choose></p>
<p>​            <when test="title != null"></when></p>
<p>​                and title = #{title}</p>
<p>​            </p>
<p>​            <when test="content != null"></when></p>
<p>​                and content = #{content}</p>
<p>​            </p>
<p>​            <otherwise></otherwise></p>
<p>​                and owner = “owner1”</p>
<p>​            </p>
<p>​        </p>
<p>​    </p>
<p>再看看下面这个例子。</p>
<p>​    <select id="bar" resulttype="Blog"></select></p>
<p>​        select * from t_blog where id in</p>
<p>​        &lt;foreach collection=”array” index=”index” </p>
<p>​            item=”item” open=”(“ separator=”,” close=”)”&gt;</p>
<p>​            #{item}</p>
<p>​        </p>
<p></p>
<h3 id="Mybatis当实体类中的属性名和表中的字段名不一样-，怎么办-？"><a href="#Mybatis当实体类中的属性名和表中的字段名不一样-，怎么办-？" class="headerlink" title="Mybatis当实体类中的属性名和表中的字段名不一样 ，怎么办 ？"></a>Mybatis当实体类中的属性名和表中的字段名不一样 ，怎么办 ？</h3><p>第1种： 通过在查询的sql语句中定义字段名的别名，让字段名的别名和实体类的属性名一致 </p>
<p>​    <select id="selectorder" parametertype="int" resultetype="me.gacl.domain.order"> </select></p>
<p>​       select order_id id, order_no orderno ,order_price price form orders where order_id=#{id}; </p>
<p> </p>
<p>第2种： 通过<resultmap>来映射字段名和实体类属性名的一一对应的关系 </resultmap></p>
<p>​    <select id="getOrder" parametertype="int" resultmap="orderresultmap"></select></p>
<p>​        select * from orders where order_id=#{id}</p>
<p>​    </p>
   <resultmap type="me.gacl.domain.order" id="orderresultmap"><br><br>​        &lt;!–用id属性来映射主键字段–&gt;<br><br>​        <id property="id" column="order_id"><br><br>​        &lt;!–用result属性来映射非主键字段，property为实体类属性名，column为数据表中的属性–&gt;<br><br>​        <result property="“orderno"" column="”order_no"/"><br><br>​        <result property="price" column="order_price"><br><br>​    <br><br><br><br>### Mybatis 模糊查询like语句该怎么写?<br><br>第1种：在Java代码中添加sql通配符。<br><br>​    string wildcardname = “%smi%”;<br><br>​    list<name> names = mapper.selectlike(wildcardname);<br><br><br><br>​    <select id="selectlike"><br><br>​     select <em> from foo where bar like #{value}<br><br>​    </em></select><br><br><br><br>第2种：在sql语句中拼接通配符，会引起sql注入<br><br>​    string wildcardname = “smi”;<br><br>​    list<name> names = mapper.selectlike(wildcardname);<br><br><br><br>​    <select id="selectlike"><br><br>​     select  from foo where bar like “%”#{value}”%”<br><br></select><br><br><br><br>### Mybatis 通常一个Xml映射文件，都会写一个Dao接口与之对应，请问，这个Dao接口的工作原理是什么？Dao接口里的方法，参数不同时，方法能重载吗？<br><br>Dao接口，就是人们常说的Mapper接口，接口的全限名，就是映射文件中的namespace的值，接口的方法名，就是映射文件中MappedStatement的id值，接口方法内的参数，就是传递给sql的参数。Mapper接口是没有实现类的，当调用接口方法时，接口全限名+方法名拼接字符串作为key值，可唯一定位一个MappedStatement，举例：com.mybatis3.mappers.StudentDao.findStudentById，可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中，每一个<select>、<insert>、<update>、<delete>标签，都会被解析为一个MappedStatement对象。<br><br><br><br>Dao接口里的方法，是不能重载的，因为是全限名+方法名的保存和寻找策略。<br><br><br><br>Dao接口的工作原理是JDK动态代理，Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象，代理对象proxy会拦截接口方法，转而执行MappedStatement所代表的sql，然后将sql执行结果返回。<br><br><br><br>### Mybatis是如何进行分页的？分页插件的原理是什么？<br><br>Mybatis使用RowBounds对象进行分页，它是针对ResultSet结果集执行的内存分页，而非物理分页，可以在sql内直接书写带有物理分页的参数来完成物理分页功能，也可以使用分页插件来完成物理分页。<br><br><br><br>分页插件的基本原理是使用Mybatis提供的插件接口，实现自定义插件，在插件的拦截方法内拦截待执行的sql，然后重写sql，根据dialect方言，添加对应的物理分页语句和物理分页参数。<br><br><br><br>### Mybatis是如何将sql执行结果封装为目标对象并返回的？都有哪些映射形式？<br><br>答：第一种是使用<resultmap>标签，逐一定义列名和对象属性名之间的映射关系。第二种是使用sql列的别名功能，将列别名书写为对象属性名，比如T_NAME AS NAME，对象属性名一般是name，小写，但是列名不区分大小写，Mybatis会忽略列名大小写，智能找到与之对应对象属性名，你甚至可以写成T_NAME AS NaMe，Mybatis一样可以正常工作。<br><br><br><br>有了列名与属性名的映射关系后，Mybatis通过反射创建对象，同时使用反射给对象的属性逐一赋值并返回，那些找不到映射关系的属性，是无法完成赋值的。<br><br><br><br>### Mybatis 如何执行批量插入?<br><br>首先,创建一个简单的insert语句:<br><br>​    <insert id="insertname"><br><br>​     insert into names (name) values (#{value})<br><br>​    </insert><br><br>然后在java代码中像下面这样执行批处理插入:<br><br>​    list<string> names = new arraylist();<br><br>​    names.add(“fred”);<br><br>​    names.add(“barney”);<br><br>​    names.add(“betty”);<br><br>​    names.add(“wilma”);<br><br><br><br>​    // 注意这里 executortype.batch<br><br>​    sqlsession sqlsession = sqlsessionfactory.opensession(executortype.batch);<br><br>​    try {<br><br>​     namemapper mapper = sqlsession.getmapper(namemapper.class);<br><br>​     for (string name : names) {<br><br>​     mapper.insertname(name);<br><br>​     }<br><br>​     sqlsession.commit();<br><br>​    } finally {<br><br>​     sqlsession.close();<br><br>}<br><br><br><br>### Mybatis 如何获取自动生成的(主)键值?<br><br>insert 方法总是返回一个int值 - 这个值代表的是插入的行数。<br><br>而自动生成的键值在 insert 方法执行完后可以被设置到传入的参数对象中。<br><br>示例:<br><br>​    <insert id="insertname" usegeneratedkeys="true" keyproperty="id"><br><br>​     insert into names (name) values (#{name})<br><br>​    </insert><br><br><br><br>​    name name = new name();<br><br>​    name.setname(“fred”);<br><br><br><br>​    int rows = mapper.insertname(name);<br><br>​    // 完成后,id已经被设置到对象中<br><br>​    system.out.println(“rows inserted = ” + rows);<br><br>system.out.println(“generated key value = ” + name.getid());<br><br><br><br>### Mybatis在mapper中如何传递多个参数?<br><br>第1种：<br><br>//DAO层的函数<br><br><br><br>Public UserselectUser(String name,String area);<br><br>//对应的xml,#{0}代表接收的是dao层中的第一个参数，#{1}代表dao层中第二参数，更多参数一致往后加即可。<br><br><br><br>&lt;select id=”selectUser”resultMap=”BaseResultMap”&gt;<br><br>​    select <em>  fromuser_user_t   whereuser_name = #{0} anduser_area=#{1}<br><br></em></string></resultmap></delete></update></insert></select><br><br>第2种：    使用 @param 注解:<br><br>​    import org.apache.ibatis.annotations.param;<br><br>​        public interface usermapper {<br><br>​         user selectuser(@param(“username”) string username,<br><br>​         @param(“hashedpassword”) string hashedpassword);<br><br>​        }<br><br>然后,就可以在xml像下面这样使用(推荐封装为一个map,作为单个参数传递给mapper):<br><br>​    <select id="selectuser" resulttype="user"><br><br>​         select id, username, hashedpassword<br><br>​         from some_table<br><br>​         where username = #{username}<br><br>​         and hashedpassword = #{hashedpassword}<br><br></select><br><br><br><br>### Mybatis动态sql是做什么的？都有哪些动态sql？能简述一下动态sql的执行原理不？<br><br>Mybatis动态sql可以让我们在Xml映射文件内，以标签的形式编写动态sql，完成逻辑判断和动态拼接sql的功能。<br><br>Mybatis提供了9种动态sql标签：trim|where|set|foreach|if|choose|when|otherwise|bind。<br><br>其执行原理为，使用OGNL从sql参数对象中计算表达式的值，根据表达式的值动态拼接sql，以此来完成动态sql的功能。<br><br><br><br>### Mybatis的Xml映射文件中，不同的Xml映射文件，id是否可以重复？<br><br>不同的Xml映射文件，如果配置了namespace，那么id可以重复；如果没有配置namespace，那么id不能重复；毕竟namespace不是必须的，只是最佳实践而已。<br><br><br><br>原因就是namespace+id是作为Map&lt;String, MappedStatement&gt;的key使用的，如果没有namespace，就剩下id，那么，id重复会导致数据互相覆盖。有了namespace，自然id就可以重复，namespace不同，namespace+id自然也就不同。<br><br><br><br>### Mybatis 为什么说是半自动ORM映射工具？它与全自动的区别在哪里？<br><br>Hibernate属于全自动ORM映射工具，使用Hibernate查询关联对象或者关联集合对象时，可以根据对象关系模型直接获取，所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时，需要手动编写sql来完成，所以，称之为半自动ORM映射工具。<br><br><br><br>### Mybatis 一对一、一对多的关联查询 ？<br><br><mapper namespace="com.lcb.mapping.userMapper"><br><br>​    <!--association  一对一关联查询 --><br><br>​    <select id="getClass" parametertype="int" resultmap="ClassesResultMap"><br><br>​        select  from class c,teacher t where c.teacher_id=t.t_id and c.c_id=#{id}<br><br>​    </select><br><br>​    <resultmap type="com.lcb.user.Classes" id="ClassesResultMap"><br><br>​        <!-- 实体类的字段名和数据表的字段名映射 --><br><br>​        <id property="id" column="c_id"><br><br>​        <result property="name" column="c_name"><br><br>​        <association property="teacher" javatype="com.lcb.user.Teacher"><br><br>​            <id property="id" column="t_id"><br><br>​            <result property="name" column="t_name"><br><br>​        </result></id></association><br><br>​    </result></id></resultmap>  



<p>​    <!--collection  一对多关联查询 -->  </p>
<p>​    <select id="getClass2" parametertype="int" resultmap="ClassesResultMap2">  </select></p>
<p>​        select * from class c,teacher t,student s where c.teacher_id=t.t_id and c.c_id=s.class_id and c.c_id=#{id}  </p>
<p>​      </p>
<p>​    <resultmap type="com.lcb.user.Classes" id="ClassesResultMap2">  </resultmap></p>
<p>​        <id property="id" column="c_id">  </id></p>
<p>​        <result property="name" column="c_name">  </result></p>
<p>​        <association property="teacher" javatype="com.lcb.user.Teacher">  </association></p>
<p>​            <id property="id" column="t_id">  </id></p>
<p>​            <result property="name" column="t_name">  </result></p>
<p>​          </p>
<p>​        <collection property="student" oftype="com.lcb.user.Student">  </collection></p>
<p>​            <id property="id" column="s_id">  </id></p>
<p>​            <result property="name" column="s_name">  </result></p>
<p>​          </p>
<p>​    </p></mapper></name></name></result></result></id></resultmap>  <p></p>
<p>  </p>

  	</div>
	  
	  <div class="article-tags tags">
      
        <a href="/tags/Java/">Java</a>
      
	  </div>
    
		
	
		<div class="art-item-footer">
				
					<span class="art-item-left"><i class="icon icon-chevron-thin-left"></i>prev：<a href="/2018/10/20/Java-面试题系列篇-Spring-框架/" rel="prev"  title="Java 面试题系列篇-Spring 框架">
						Java 面试题系列篇-Spring 框架 
					</a></span>
				
				
					<span class="art-item-right">next：<a href="/2018/10/20/Java-面试题系列篇-Hibernate-框架/" rel="next"  title="Java 面试题系列篇-Hibernate 框架">
						Java 面试题系列篇-Hibernate 框架
					</a><i class="icon icon-chevron-thin-right"></i></span>
				
		</div>
	
	</section>
	
</article>
<script>
	window.subData = {
		title: 'Java 面试题系列篇-Mybatis 框架',
		tools: true
	}
</script>

      </div>
      <aside class='l_side'>
        
  <section class='m_widget links'>
<div class='header'>Links</div>
<div class='content'>
    <ul class="entry">
    
        <li><a class="flat-box" target="_blank" href="https://iiong.com/">
            <div class='name'>淮城一只猫</div>
        </a></li>
    
    </ul>
</div>
</section>

  <section class='m_widget categories'>
<div class='header'>Categories</div>
<div class='content'>
    
    <ul class="entry">
    
        <li><a class="flat-box" href="/categories/Android基础/"><div class='name'>Android基础</div><div class='badget'>1</div></a></li>
    
    </ul>
    
</div>
</section>

  
<div class="m_widget tagcloud">
    <div class="header">Tags</div>
    <div class='content'>
        <a href="/tags/Android/" style="font-size: 14px; color: #808080">Android</a> <a href="/tags/HTML/" style="font-size: 14px; color: #808080">HTML</a> <a href="/tags/Java/" style="font-size: 20px; color: #000">Java</a> <a href="/tags/Python/" style="font-size: 14px; color: #808080">Python</a>
    </div>
</div>



      </aside>
      <script>setLoadingBarProgress(60);</script>
    </div>
  </div>
  <footer id="footer" class="clearfix">

	<div class="social-wrapper">
  	
      
        <a href="https://github.com/stkevintan" class="social github"
          target="_blank" rel="external">
          <span class="icon icon-github"></span>
        </a>
      
        <a href="https://twitter.com/kevinsfork" class="social twitter"
          target="_blank" rel="external">
          <span class="icon icon-twitter"></span>
        </a>
      
        <a href="/atom.xml" class="social rss"
          target="_blank" rel="external">
          <span class="icon icon-rss"></span>
        </a>
      
    
  </div>
  
  <div>Theme <a href='https://github.com/stkevintan/hexo-theme-material-flow' class="codename">MaterialFlow</a> designed by <a href="http://keyin.me/" target="_blank">Kevin Tan</a>.</div>
  
</footer>


  <script>setLoadingBarProgress(80);</script>
  

<script src="//apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script src='//cdn.bootcss.com/node-waves/0.7.5/waves.min.js'></script>
<script src="//cdn.bootcss.com/scrollReveal.js/3.3.2/scrollreveal.min.js"></script>
<script src="/js/jquery.fitvids.js"></script>
<script>
	var GOOGLE_CUSTOM_SEARCH_API_KEY = "";
	var GOOGLE_CUSTOM_SEARCH_ENGINE_ID = "";
	var ALGOLIA_API_KEY = "";
	var ALGOLIA_APP_ID = "";
	var ALGOLIA_INDEX_NAME = "";
  var AZURE_SERVICE_NAME = "";
  var AZURE_INDEX_NAME = "";
  var AZURE_QUERY_KEY = "";
  var BAIDU_API_ID = "";
  var SEARCH_SERVICE = "hexo";
  var ROOT = "/"||"/";
  if(!ROOT.endsWith('/'))ROOT += '/';
</script>
<script src="/js/search.js"></script>
<script src="/js/app.js"></script>


  <script>setLoadingBarProgress(100);</script>
</body>
</html>
